package logs

import (
	"os"
	"encoding/json"
	"sync"
	"io"
	"time"
	"runtime"
)

/**
添加颜色到方法中
 */
type brush func(string) string

/**
闭包返回颜色
 */
func newBrush(color string) brush  {
	pre := "\033["
	reset := "\033[0m"
	return func(text string) string{
		return pre + color + "m" + text + reset
	}
}

/**
字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色
 */
var colors = []brush{
	newBrush("1;36"), // Debug              white
	newBrush("1;37"), // Info               cyan
	newBrush("1;35"), // Warn               magenta
	newBrush("1;31"), // Error              red
	newBrush("1;33"), // Fatal              yellow
	newBrush("1;34"), // Panic              green
}



/**
命令行
@attr Level 输出级别
@attr Color 是否使用颜色,默认非windows 使用
@attr writer io.Writer 输出流,默认为os.stdout
@attr sync.Mutex 输出锁
 */
type consoleWriter struct  {
	sync.Mutex
	Level int `json:"level"`
	Color bool `json:"color"`
	writer io.Writer
}


/**
创建命令行输出方式
默认为Debug级别
@return Output 接口类型
 */
func NewConsole() Output {
	console := &consoleWriter{
		writer : os.Stdout,
		Level : DebugLevel,
		Color : runtime.GOOS != "windows",
	}
	return console
}

/**
设置输出
 */
func (c *consoleWriter) Set(config []byte) error  {
	if len(config) == 0 {
		return nil
	}
	return json.Unmarshal(config, c)
}

func (c *consoleWriter) Write(when time.Time, msg string, level int) error {
	if level < c.Level {
		return nil
	}

	if c.Color {
		msg = colors[level](msg)
	}
	c.println(when, msg)
	return nil
}

func (c *consoleWriter) println(when time.Time, msg string) {
	c.Lock()
	h := formatTimeHeader(when)
	c.writer.Write(append(append(h, msg...), '\n'))
	c.Unlock()
}

func (c *consoleWriter) Flush()  {
	//使用cosole 不需要刷新缓存
}


func (c *consoleWriter) Close()  {
	//使用cosole 不需要关闭
}

func init()  {
	Register("console", NewConsole)
}